<?php

namespace Org;
class ZpRedis extends \Think\Cache\Driver\Redis
{
    static public $timeout = 1;
    static public $queueName = 'ZpQueues';
    /**
     * 取得缓存类实例
     * @static
     * @access public
     * @return mixed
     */
    public static function getInstance($queueName)
    {
        if (C('DATA_CACHE_TYPE') != 'Redis') exit('DATA_CACHE_TYPE DO NOT Support Redis');
        //当前队列名称
        self::$queueName = 'ring_' . $queueName;
        static $_instance = array();
        if (!isset($_instance[self::$queueName])) {
            $_instance[self::$queueName] = new ZpRedis();
        }
        return $_instance[self::$queueName];
    }
	//获取 redis 的所有键值
	public function getKeys(){
		return $this->keys('*');
	}
	//查看数据库现在有多少key
	public function numKeys(){
		return $this->dbSize();
	}
    //设置队列名称
    public static function setQueueName($name)
    {
        self::$queueName = 'ring_' . $name;
    }
    /**
     * 添加队列(lpush)
     * @param string $value
     * @return int 队列长度
     */
    public function push($value)
    {
        return $this->lPush(self::$queueName, $value);
    }
    /**
     * 读取队列,将读取到的值放在队列最左侧
     * @return string|nil
     */
    public function pop()
    {
        $result = $this->brPop(self::$queueName, self::$timeout);
        if (empty($result)) {
            return false;
        } else {
            //将取出来的值添加到最队列最左侧
            //$this->lPush(self::$queueName, $result[1]);
			
			//删除队列中的这个值
			$this->delValue($result[1],1);
            return $result[1];
        }
    }
	/*
		返回名称为key的list中索引为$index位置的元素
	*/
	public function lindex($index){
		return $this->lGet(self::$queueName,$index);
	}
	/*
		返回名称为key的list中start至end之间的元素，end为-1，返回所有
	*/
	public function all($start,$end){
		return $this->lRange(self::$queueName,$start,$end);
	}
	/*
		删除 count 个名称为 key 的 list 中值为 value 的元素。count 为 0，删除所有值为 value
		的元素，count>0从头至尾删除count个值为value的元素，count<0从尾到头删除|count|
		个值为value的元素 
	*/
	public function delValue($value,$count){
		return $this->lRem(self::$queueName,$value,$count);
	}
    /**
     * 删除一个消息队列
     */
    public function flushQueue()
    {
        $this->delete(self::$queueName);
    }
    /**
     * 返回队列长茺  LLEN/lSize
     * @return int
     */
    public function len()
    {
        return $this->lSize(self::$queueName);
    }
}
